﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Microsoft.Exchange.WebServices.Data;
using System.Net;
using System.Net.Sockets;
using System.IO;
using Entity;
using Newtonsoft.Json;

using EWService;
using POPService;
using IMAPService;
using SSLService;

namespace MailEngine
{
    public interface IMailEngine 
    {
        void Connection(UserAccount _ua);
        void CreateFolder(UserAccount _ua, string _folderName, string _parentFolderID);
        void DeleteFolder(UserAccount _ua, string _targetFolderID, DeleteModes _mode);
        void RenameFolder(UserAccount _ua, string _targetFolderID, string _newName);
        List<MailFolder> GetFolderList(UserAccount _ua);
        int GetFullMailCount(UserAccount _ua);
        int GetUnreadMailCount(UserAccount _ua);
        //MailList GetMailSimpleContent(UserAccount _ua);
        //Mail GetSingleMailContent(string _mailID);
        //AttachmentFiles GetSingleAttachment(string _fileID);
        //MailList GetMailList(UserAccount _ua, string _folderID, int _pageCount, int _offset, bool _isInit, bool _onlyCount);
        void SaveMail(UserAccount _ua, Mail _mail);
        void MoveMail(UserAccount _ua, string _mailID, string _targetFolderID);
        void CopyMail(UserAccount _ua, string _mailID, string _targetFolderID);
        void EmptyFolder(UserAccount _ua, string _targetFolderID);
        void DeleteMail(UserAccount _ua, string _targetMailID, DeleteModes _mode);
        void SendMail(UserAccount _ua, Mail _mail);
    }

    public class EwsEngine : IMailEngine//EWS Service Interface
    {
        void IMailEngine.Connection(UserAccount _ua)//建立EWS Service 
        {
            if (!ConnectionCache.Connections.Contains("EWS_" + _ua.MailAddress))
                ConnectionCache.Connections.Add("EWS_" + _ua.MailAddress, EWService.EWService.Connection(_ua));       
        }

        void IMailEngine.CreateFolder(UserAccount _ua, string _folderName, string _parentFolderID)//创建文件夹
        {
            EWService.EWService.CreateFolder(_ua, _folderName, _parentFolderID);
            //Folder _newFolder = new Folder();
            //switch (_ua.ServiceType)
            //{
            //    case ServiceType.EWS_2007_SP1:
            //        EWService.EWService.CreateFolder(_service, _folderName, _parentFolderID);
            //        break;

            //    case ServiceType.EWS_2010:
            //        break;
            //    default: break;
            //}
        }

        void IMailEngine.DeleteFolder(UserAccount _ua, string _targetFolderID, DeleteModes _mode)//删除文件夹
        {
            EWService.EWService.DeleteFolder(_ua, _targetFolderID, _mode);
        }

        void IMailEngine.RenameFolder(UserAccount _ua, string _targetFolderID, string _newName)//重命名文件夹
        {
            EWService.EWService.RenameFolder(_ua, _targetFolderID, _newName);
            //switch (_ua.ServiceType)
            //{
            //    case ServiceType.EWS_2007_SP1:
            //        ExchangeService _service = EWService.EWService.Connection(_ua);
            //        EWService.EWService.RenameFolder(_service, _targetFolderID, _newName);

            //        break;
            //    case ServiceType.EWS_2010:
            //        break;
            //    default: break;
            //}
        }
        
        List<MailFolder> IMailEngine.GetFolderList(UserAccount _ua)//获取文件夹列表
        {
            List<MailFolder> _list = new List<MailFolder>();
            _list = EWService.EWService.GetFolderList(_ua, MailFolderType.MsgRoot);
            return _list;
        }

        int IMailEngine.GetFullMailCount(UserAccount _ua)//获取收件箱全部邮件数
        {
            return EWService.EWService.GetMailCounts(_ua, 10, 0, true);           
        }

        int IMailEngine.GetUnreadMailCount(UserAccount _ua)//获取收件箱未读邮件数
        {
            return EWService.EWService.GetMailCounts(_ua, 10, 0, false);
        }
        //MailList IMailEngine.GetMailList(UserAccount _ua, string _folderID, int _pageCount, int _offset, bool _isInit, bool _onlyCount)//获取邮件列表
        //{
        //    MailList _list = new MailList();
        //    if (_onlyCount)
        //    {
        //        _list = EWService.EWService.GetMailCounts(_ua, _pageCount, _offset, _isInit);
        //    }
        //    else
        //    {
        //        _list = EWService.EWService.GetMailList(_ua, _folderID, _pageCount, _offset, _isInit);
        //    }

        //    return _list;
        //}

        void IMailEngine.SaveMail(UserAccount _ua, Mail _mail)//保存邮件到草稿
        {
            EmailMessage _em = EWService.EWService.CreateMail(_ua, _mail);

            _em.Save();
        }

        void IMailEngine.MoveMail(UserAccount _ua, string _mailID, string _targetFolderID)//移动邮件
        {
            EWService.EWService.MoveMail(_ua, _mailID, _targetFolderID);
        }

        void IMailEngine.CopyMail(UserAccount _ua, string _mailID, string _targetFolderID)
        {
            EWService.EWService.CopyMail(_ua, _mailID, _targetFolderID);
        }

        void IMailEngine.EmptyFolder(UserAccount _ua, string _targetFolderID)//清空目录（包括回收站）只能在ews2010sp1以上版本才能用
        {
            EWService.EWService.EmptyFolder(_ua, _targetFolderID);
        }

        void IMailEngine.DeleteMail(UserAccount _ua, string _targetMailID, DeleteModes _mode)//删除邮件
        {
            EWService.EWService.DeleteMail(_ua, _targetMailID, _mode);
        }

        void IMailEngine.SendMail(UserAccount _ua, Mail _mail)//发送邮件并保存到已发
        {
            EmailMessage _em = EWService.EWService.CreateMail(_ua, _mail);

            if (_em.ToRecipients.Count > 0)
            {
                _em.SendAndSaveCopy();
            }
            else
            {
                throw new Exception("输入发送目标");
            }
            
        }
    }

    //public class PopEngine : IMailEngine//POP Service Interface
    //{
    //    void IMailEngine.Connection(UserAccount _ua)
    //    {
    //        if (!ConnectionCache.Connections.Contains("POP_" + _ua.MailAddress))
    //            ConnectionCache.Connections.Add("POP_" + _ua.MailAddress, POPService.POPService.Connection(_ua));
    //    }

    //    void IMailEngine.CreateFolder(UserAccount _ua, string _folderName, string _parentFolderID)
    //    {

    //    }

    //    void IMailEngine.DeleteFolder(UserAccount _ua, string _targetFolderID, DeleteModes _mode)
    //    {
            
    //    }

    //    void IMailEngine.RenameFolder(UserAccount _ua, string _targetFolderID, string _newName)
    //    {

    //    }

    //    List<MailFolder> IMailEngine.GetFolderList(UserAccount _ua, MailFolderType _folder, string _folderID)
    //    {
    //        return null;
    //    }

    //    MailList IMailEngine.GetMailList(UserAccount _ua, string _folderID, int _pageCount, int _offset, bool _isInit, bool _onlyCount)
    //    {
    //        POPService.POPService.GetMailList(_ua);
    //        return null;
    //    }

    //    void IMailEngine.SaveMail(UserAccount _ua, Mail _mail)
    //    {

    //    }

    //    void IMailEngine.MoveMail(UserAccount _ua, string _mailID, string _targetFolderID)
    //    {
            
    //    }

    //    void IMailEngine.CopyMail(UserAccount _ua, string _mailID, string _targetFolderID)
    //    {
            
    //    }

    //    void IMailEngine.EmptyFolder(UserAccount _ua, string _targetFolderID)
    //    {

    //    }

    //    void IMailEngine.DeleteMail(UserAccount _ua, string _targetMailID, DeleteModes _mode)
    //    {

    //    }

    //    void IMailEngine.SendMail(UserAccount _ua, Mail _mail)
    //    {
 
    //    }
    //}

    //public class ImapEngine : IMailEngine//IMAP Service Interface
    //{
    //    void IMailEngine.Connection(UserAccount _ua)
    //    {
    //        if (_ua.IsSSL)
    //        {
    //            SSLService.sslIMAP.Connection(_ua);
    //        }
    //        else
    //        {
    //            if (!ConnectionCache.Connections.Contains("IMAP_" + _ua.MailAddress))
    //                ConnectionCache.Connections.Add("IMAP_" + _ua.MailAddress, IMAPService.IMAPService.Connection(_ua));
    //        }
    //    }

    //    void IMailEngine.CreateFolder(UserAccount _ua, string _folderName, string _parentFolderID)
    //    {

    //    }

    //    void IMailEngine.DeleteFolder(UserAccount _ua, string _targetFolderID, DeleteModes _mode)
    //    {

    //    }

    //    void IMailEngine.RenameFolder(UserAccount _ua, string _targetFolderID, string _newName)
    //    {

    //    }

    //    List<MailFolder> IMailEngine.GetFolderList(UserAccount _ua, MailFolderType _folderType, string _folderID)
    //    {
    //        //POP3_Client _service = ConnectionCache.Connections[_ua.MailAddress] as POP3_Client;
    //        return IMAPService.IMAPService.GetFolderList(_ua, _folderType, _folderID);
            
    //        //return null;
    //    }

    //    MailList IMailEngine.GetMailList(UserAccount _ua, string _folderID, int _pageCount, int _offset, bool _isInit, bool _onlyCount)
    //    {
    //        IMAPService.IMAPService.GetMailList(_ua, _folderID, _isInit);
    //        return null;
    //    }

    //    void IMailEngine.SaveMail(UserAccount _ua, Mail _mail)
    //    {

    //    }

    //    void IMailEngine.MoveMail(UserAccount _ua, string _mailID, string _targetFolderID)
    //    {

    //    }

    //    void IMailEngine.CopyMail(UserAccount _ua, string _mailID, string _targetFolderID)
    //    {

    //    }

    //    void IMailEngine.EmptyFolder(UserAccount _ua, string _targetFolderID)
    //    {

    //    }

    //    void IMailEngine.DeleteMail(UserAccount _ua, string _targetMailID, DeleteModes _mode)
    //    {

    //    }

    //    void IMailEngine.SendMail(UserAccount _ua, Mail _mail)
    //    {

    //    }
    //}
}
